<?php
/**  综合静态类，用于各种特殊函数 */
class DnMisc {
	/**
	 * 这个函数是其它函数单例模式的函数 TODO: 带参数的时候
	 */
	public static function SingletonSelf($obj = null, $classname, $mustbe_childclass = false) {
		$key = 'Dvaknheo_' . $classname;
		if (!isset ($GLOBALS[$key])) {
			$GLOBALS[$key] = null;
		}
		if ($obj) {
			if ($mustbe_childclass && !is_a($obj, $classname)) {
				$GLOBALS[$key] = $GLOBALS[$key] ? $GLOBALS[$key] : new $classname ();
			} else {
				$GLOBALS[$key] = $obj;
			}
		} else if (empty($GLOBALS[$key])){ 
			$GLOBALS[$key] = new $classname ();
		}
		return $GLOBALS[$key];
	}
	/**
	 * 把 Object 变成 Array;
	 * @param string  要变的
	 */
	public static function ObjectToArray($obj) {
		return get_object_vars($obj);
	}
	/**
	 * 把 Array 变成 Object 对象 ， Object To Array 可以用 new stdClass ($array); 
	 */
	public static function ArrayToObject($array) {
		if (is_array($array)) {
			$ret = (object) $array; // stdClass ??
		} else {
			return null;
		}

	}
	/**
	 * 这里是把 数据库返回的列表变成 根据 prikey 变成 可前缀
	 */
	function ArrayToAssoc($a, $prefix = '', $priKey = 'id') {
		$ret = array ();
		foreach ($a as $line) {
			$key = ($prefix) ? $prefix . '_' . $line[$priKey] : $line[$priKey];
			$ret[$key] = $line;
		}
		return $ret;
	}
	/**
	 * 读取数据列表的 某一列
	 */
	public static function ArrayGetColumn($array, $columnname) {
		$ret = array ();
		foreach ($array as $row) {
			$ret[] = $row[$columnname];
		}
		return $ret;
	}
	/**
	 * 根据 id 得到 列表的某一行
	 */
	function ArrayGetRowById($array, $id, $col = 'id') {
		$ret = array ();
		foreach ($array as $row) {
			if ($id == $row[$col]) {
				return $row;
			}
		}
		return $ret;
	}
	/**
	 * 把列表分割成 几个小块回调 ,  $callback($group,$last_return)
	 */
	public static function ArrayGroupWalk($array, $length, $callback) {
		//callback($group,$last)
		$last_return = null;
		for ($i = 0; $i < 10000; $i++) {
			$group = array_slice($array, $i * $length, $length);
			if (empty ($group)) {
				break;
			}
			$last_return = call_user_func($callback, $group, $last_return);
		}
		return $last_return;
	}
	/**
	 *  取得当前第几页的数组,默认分页为 20
	*/
	function ArraySplitPage($array, $page, $pagesize = 20) {
		if (!$page) {
			$page = 1;
		}
		$ret = array_slice($array, $page * $pagesize, $pagesize);
		return $ret;
	}
	/**
	 *  取得 array[$type]==$value 的数组
	 */
	function ArrayFetchByType($array, $type, $value) {
		$ret = array ();
		foreach ($array as $k => $v) {
			if ($v[$type] == $value)
				$ret[$k] = $v;
		}
		return $ret;
	}
	/**
	 *  和 ArrayFetchByType 相反，值不为的时候才取
	 */
	function ArrayFetchExcludeType($array, $type, $value) {
		$ret = array ();
		foreach ($array as $k => $v) {
			if ($v[$type] != $value)
				$ret[$k] = $v;
		}
		return $ret;
	}
	/**
	 * 这个函数是 用来加载其它的 __autoload()的;
	 */
	public static function RegistAutoLoad($callback) {
		spl_autoload_register(null, false); //初始化
		spl_autoload_extensions('.php,.class.php'); //限制允许autoload的文件
		spl_autoload_register($callback); //设置autoload
	}

	public function IsAssocArray() {
		return array_diff_assoc(array_keys($var), range(0, sizeof($var))) ? TRUE : FALSE;
	}
	function FilterArrayInput($array, $key, $default, $type = null) {
		if (!isset ($array[$key])) {
			return $default;
		}
		$v = $array[$key];
		if (!$type) {
			return $v;
		}

		switch ($type) {
			case 'int' :
				$v = (int) $v;
				break;
			case 'string' :
				$v = (string) $v;
				break;
			default :
				}
		return $v;
	}
	public static function DumpRecordSet($data)
	{
		$keys=array();
		foreach($data as $row){
			foreach($row as $k=>$v){
				$keys[$k]=true;
			}
		}
		echo "<table border='1'>\n";
		echo "<tr>\n";
		foreach($keys as $key =>$nouse){
			echo "<th>$key</th>";
		}
		echo "</tr>\n";
		foreach($data as $row){
			echo "<tr>\n";
			foreach($keys as $key =>$nouse){
				$str=isset($row[$key])?$row[$key]:'----';
				if(is_array($str)){
					$str=implode("|",$str);
				}
				echo "<td>".$str."</td>";
			}
			echo "</tr>\n";
		}
		echo "</table>\n";
	}
	public static function Dirs($dir,$except=array())
	{
		$dirs = glob($dir.'/'.'*', GLOB_ONLYDIR | GLOB_NOSORT);
		$ret=array($dir);
		foreach($dirs as $newdir){
			if(in_array(basename($newdir),$except)){continue;}
			$t=self::Dirs($newdir);
			$ret=array_merge($ret,$t);
		}
		return $ret;
	}
	public static function GetProjectPhpFiles()
	{
		$ret=array();
		$dirs=array('','services','services/model','include','Local',TW_PLATFORM);
		foreach($dirs as $dir){
			$path=$dir.'/'.'*.php';
			if(!$dir)$path='*.php';
			$ret=array_merge($ret,glob($path));
		}
		return $ret;
	}
	public static function ArrayJoin($array,$value_key,$id_key='id')
	{
		$ret=array();
		foreach($array as $row){
			$ret[$row[$id_key]]=$row[$value_key];
		}
		return $ret;
	}

}